--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
nomadnet/Directory.py 38e4da07972caf0294cd28a77f7ebe9b03c9a76d (38e4da07) Text, 17.28 KB
Tff7b72import T7ee787os
Tff7b72import T7ee787RNS
Tff7b72import T7ee787LXMF
Tff7b72import T7ee787time
Tff7b72import T7ee787nomadnet
Tff7b72import T7ee787threading
Tff7b72import T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787umsgpack Tff7b72as T7ee787msgpack
Tff7b72from T7ee787LXMF Tff7b72import Te6edf3pn_announce_data_is_valid
Tff7b72from T7ee787nomadnetT7ee787.T7ee787util Tff7b72import Te6edf3strip_modifiers
Tff7b72from T7ee787nomadnetT7ee787.T7ee787util Tff7b72import Te6edf3sanitize_name
Tff7b72class T56d364PNAnnounceHandlerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffaspect_filter Tff7b72= Ta5d6ff"Ta5d6fflxmf.propagationTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72def Td2a8ffreceived_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3announced_identityTb4b4b4, Te6edf3app_dataTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3pn_announce_data_is_validTb4b4b4(Te6edf3app_dataTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3app_dataTb4b4b4)
Tff7b72if Te6edf3dataTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72== Tff7b72TrueTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReceived active propagation node announce from Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3associated_peer Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Ta5d6ff"Ta5d6fflxmf.deliveryTa5d6ff"Tb4b4b4, Te6edf3announced_identityTb4b4b4)
Te6edf3associated_node Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Ta5d6ff"Ta5d6ffnomadnetwork.nodeTa5d6ff"Tb4b4b4, Te6edf3announced_identityTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffappTff7b72.Td2a8ffdirectoryTff7b72.Td2a8ffpn_announce_receivedTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3app_dataTb4b4b4, Te6edf3associated_peerTb4b4b4, Te6edf3associated_nodeTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffappTff7b72.Td2a8ffautoselect_propagation_nodeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while evaluating propagation node announce, ignoring announce.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72class T56d364DirectoryTb4b4b4:
Te6edf3ANNOUNCE_STREAM_MAXLENGTH Tff7b72= T79c0ff256
Te6edf3aspect_filter Tff7b72= Ta5d6ff"Ta5d6ffnomadnetwork.nodeTa5d6ff"
Tf0883e@staticmethod
Tff7b72def Td2a8ffreceived_announceTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3announced_identityTb4b4b4, Te6edf3app_dataTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3app Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffNomadNetworkAppTff7b72.Td2a8ffget_shared_instanceTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3destination_hash Tff7b72in Te6edf3appTff7b72.Td2a8ffignored_listTb4b4b4:
Te6edf3associated_peer Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Ta5d6ff"Ta5d6fflxmf.deliveryTa5d6ff"Tb4b4b4, Te6edf3announced_identityTb4b4b4)
Te6edf3appTff7b72.Td2a8ffdirectoryTff7b72.Td2a8ffnode_announce_receivedTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3app_dataTb4b4b4, Te6edf3associated_peerTb4b4b4)
Te6edf3appTff7b72.Td2a8ffautoselect_propagation_nodeTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIgnored announce from Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while evaluating LXMF destination announce, ignoring announce.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffannounce_streamTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_node_announcesTff7b72+Tff7b72selfTff7b72.Td2a8ff_peer_announcesTff7b72+Tff7b72selfTff7b72.Td2a8ff_pn_announces
Tff7b72def Td2a8ff_clean_node_announcesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_node_announcesTb4b4b4) Tff7b72> Te6edf3DirectoryTff7b72.Td2a8ffANNOUNCE_STREAM_MAXLENGTHTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_node_announcesTff7b72.Td2a8ffpopTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_clean_peer_announcesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_peer_announcesTb4b4b4) Tff7b72> Te6edf3DirectoryTff7b72.Td2a8ffANNOUNCE_STREAM_MAXLENGTHTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_peer_announcesTff7b72.Td2a8ffpopTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_clean_pn_announcesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_pn_announcesTb4b4b4) Tff7b72> Te6edf3DirectoryTff7b72.Td2a8ffANNOUNCE_STREAM_MAXLENGTHTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_pn_announcesTff7b72.Td2a8ffpopTb4b4b4(Tb4b4b4)
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdirectory_entries Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_node_announces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_peer_announces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_pn_announces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8ffannounce_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffload_from_diskTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpn_announce_handler Tff7b72= Te6edf3PNAnnounceHandlerTb4b4b4(Tff7b72selfTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregister_announce_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpn_announce_handlerTb4b4b4)
Tff7b72def Td2a8ffsave_to_diskTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3packed_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Te6edf3e Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]
Te6edf3packed_listTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3eTff7b72.Td2a8ffsource_hashTb4b4b4, Te6edf3eTff7b72.Td2a8ffdisplay_nameTb4b4b4, Te6edf3eTff7b72.Td2a8fftrust_levelTb4b4b4, Te6edf3eTff7b72.Td2a8ffhosts_nodeTb4b4b4, Te6edf3eTff7b72.Td2a8ffpreferred_deliveryTb4b4b4, Te6edf3eTff7b72.Td2a8ffidentifyTb4b4b4, Te6edf3eTff7b72.Td2a8ffsort_rankTb4b4b4)Tb4b4b4)
Te6edf3directory Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffentry_listTa5d6ff"Tb4b4b4: Te6edf3packed_listTb4b4b4,
Ta5d6ff"Ta5d6ffannounce_streamTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffannounce_stream
Tb4b4b4}
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffdirectorypathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3directoryTb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not write directory to disk. Then contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffload_from_diskTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffdirectorypathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffdirectorypathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3unpacked_directory Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3unpacked_list Tff7b72= Te6edf3unpacked_directoryTb4b4b4[Ta5d6ff"Ta5d6ffentry_listTa5d6ff"Tb4b4b4]
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3entries Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3e Tff7b72in Te6edf3unpacked_listTb4b4b4:
Tff7b72if Te6edf3eTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3eTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffUndefinedTa5d6ff"
Tff7b72if Tffa657lenTb4b4b4(Te6edf3eTb4b4b4) Tff7b72> T79c0ff3Tb4b4b4:
Te6edf3hosts_node Tff7b72= Te6edf3eTb4b4b4[T79c0ff3Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3hosts_node Tff7b72= Tff7b72False
Tff7b72if Tffa657lenTb4b4b4(Te6edf3eTb4b4b4) Tff7b72> T79c0ff4Tb4b4b4:
Te6edf3preferred_delivery Tff7b72= Te6edf3eTb4b4b4[T79c0ff4Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3preferred_delivery Tff7b72= Tff7b72None
Tff7b72if Tffa657lenTb4b4b4(Te6edf3eTb4b4b4) Tff7b72> T79c0ff5Tb4b4b4:
Te6edf3identify Tff7b72= Te6edf3eTb4b4b4[T79c0ff5Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3identify Tff7b72= Tff7b72False
Tff7b72if Tffa657lenTb4b4b4(Te6edf3eTb4b4b4) Tff7b72> T79c0ff6Tb4b4b4:
Te6edf3sort_rank Tff7b72= Te6edf3eTb4b4b4[T79c0ff6Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3sort_rank Tff7b72= Tff7b72None
Te6edf3entriesTb4b4b4[Te6edf3eTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4] Tff7b72= Te6edf3DirectoryEntryTb4b4b4(Te6edf3eTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3eTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3eTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3hosts_nodeTb4b4b4, Te6edf3preferred_deliveryTff7b72=Te6edf3preferred_deliveryTb4b4b4, Te6edf3identify_on_connectTff7b72=Te6edf3identifyTb4b4b4, Te6edf3sort_rankTff7b72=Te6edf3sort_rankTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdirectory_entries Tff7b72= Te6edf3entries
Te6edf3astream Tff7b72= Te6edf3unpacked_directoryTb4b4b4[Ta5d6ff"Ta5d6ffannounce_streamTa5d6ff"Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_node_announces Tff7b72= Tb4b4b4[Te6edf3e Tff7b72for Te6edf3e Tff7b72in Te6edf3astream Tff7b72if Te6edf3eTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_peer_announces Tff7b72= Tb4b4b4[Te6edf3e Tff7b72for Te6edf3e Tff7b72in Te6edf3astream Tff7b72if Te6edf3eTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffpeerTa5d6ff"Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_pn_announces Tff7b72= Tb4b4b4[Te6edf3e Tff7b72for Te6edf3e Tff7b72in Te6edf3astream Tff7b72if Te6edf3eTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffpnTa5d6ff"Tb4b4b4]
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load directory from disk. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8fflxmf_announce_receivedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3app_dataTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffannounce_lockTb4b4b4:
Tff7b72if Te6edf3app_data Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffcompact_streamTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3remove_announces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3announce Tff7b72in Tff7b72selfTff7b72.Td2a8ff_peer_announcesTb4b4b4:
Tff7b72if Te6edf3announceTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Te6edf3source_hashTb4b4b4: Te6edf3remove_announcesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3announceTb4b4b4)
Tff7b72for Te6edf3a Tff7b72in Te6edf3remove_announcesTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_peer_announcesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3aTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while compacting the announce stream. The contained exception was:Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3timestamp Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_peer_announcesTff7b72.Td2a8ffinsertTb4b4b4(T79c0ff0Tb4b4b4, Tb4b4b4(Te6edf3timestampTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3app_dataTb4b4b4, Ta5d6ff"Ta5d6ffpeerTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_clean_peer_announcesTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffuiTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffui Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTb4b4b4, Ta5d6ff"Ta5d6ffmain_displayTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffmain_displayTff7b72.Td2a8ffsub_displaysTff7b72.Td2a8ffnetwork_displayTff7b72.Td2a8ffdirectory_change_callbackTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffnode_announce_receivedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3app_dataTb4b4b4, Te6edf3associated_peerTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffannounce_lockTb4b4b4:
Tff7b72if Te6edf3app_data Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffcompact_streamTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3remove_announces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3announce Tff7b72in Tff7b72selfTff7b72.Td2a8ff_node_announcesTb4b4b4:
Tff7b72if Te6edf3announceTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Te6edf3source_hashTb4b4b4:
Te6edf3remove_announcesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3announceTb4b4b4)
Tff7b72for Te6edf3a Tff7b72in Te6edf3remove_announcesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_node_announcesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3aTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while compacting the announce stream. The contained exception was:Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3timestamp Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_node_announcesTff7b72.Td2a8ffinsertTb4b4b4(T79c0ff0Tb4b4b4, Tb4b4b4(Te6edf3timestampTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3app_dataTb4b4b4, Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_clean_node_announcesTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fftrust_levelTb4b4b4(Te6edf3associated_peerTb4b4b4) Tff7b72== Te6edf3DirectoryEntryTff7b72.Td2a8ffTRUSTEDTb4b4b4:
Te6edf3existing_entry Tff7b72= Tff7b72selfTff7b72.Td2a8fffindTb4b4b4(Te6edf3source_hashTb4b4b4)
Tff7b72if Tff7b72not Te6edf3existing_entryTb4b4b4:
Te6edf3node_entry Tff7b72= Te6edf3DirectoryEntryTb4b4b4(Te6edf3source_hashTb4b4b4, Te6edf3display_nameTff7b72=Te6edf3app_dataTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3trust_levelTff7b72=Te6edf3DirectoryEntryTff7b72.Td2a8ffTRUSTEDTb4b4b4, Te6edf3hosts_nodeTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrememberTb4b4b4(Te6edf3node_entryTb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTb4b4b4, Ta5d6ff"Ta5d6ffmain_displayTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffmain_displayTff7b72.Td2a8ffsub_displaysTff7b72.Td2a8ffnetwork_displayTff7b72.Td2a8ffdirectory_change_callbackTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffpn_announce_receivedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3app_dataTb4b4b4, Te6edf3associated_peerTb4b4b4, Te6edf3associated_nodeTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffannounce_lockTb4b4b4:
Te6edf3found_node Tff7b72= Tff7b72None
Tff7b72for Te6edf3sh Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72if Te6edf3sh Tff7b72== Te6edf3associated_nodeTb4b4b4:
Te6edf3found_node Tff7b72= Tff7b72True
Tff7b72break
Tff7b72for Te6edf3e Tff7b72in Tff7b72selfTff7b72.Td2a8ff_pn_announcesTb4b4b4:
Tff7b72if Te6edf3eTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Te6edf3associated_nodeTb4b4b4:
Te6edf3found_node Tff7b72= Tff7b72True
Tff7b72break
T8b949e# TODO: Remove debug and rethink this (needs way to set PN when node is saved)
Tff7b72if Tff7b72True Tff7b72or Tff7b72not Te6edf3found_nodeTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffcompact_streamTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3remove_announces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3announce Tff7b72in Tff7b72selfTff7b72.Td2a8ff_pn_announcesTb4b4b4:
Tff7b72if Te6edf3announceTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Te6edf3source_hashTb4b4b4:
Te6edf3remove_announcesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3announceTb4b4b4)
Tff7b72for Te6edf3a Tff7b72in Te6edf3remove_announcesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_pn_announcesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3aTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while compacting the announce stream. The contained exception was:Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3timestamp Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pn_announcesTff7b72.Td2a8ffinsertTb4b4b4(T79c0ff0Tb4b4b4, Tb4b4b4(Te6edf3timestampTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3app_dataTb4b4b4, Ta5d6ff"Ta5d6ffpnTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_clean_pn_announcesTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffuiTa5d6ff"Tb4b4b4) Tff7b72and Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTb4b4b4, Ta5d6ff"Ta5d6ffmain_displayTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffuiTff7b72.Td2a8ffmain_displayTff7b72.Td2a8ffsub_displaysTff7b72.Td2a8ffnetwork_displayTff7b72.Td2a8ffdirectory_change_callbackTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffremove_announce_with_timestampTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3timestampTb4b4b4)Tb4b4b4:
Te6edf3selected_announce Tff7b72= Tff7b72None
Tff7b72for Te6edf3announce Tff7b72in Tff7b72selfTff7b72.Td2a8ff_node_announcesTb4b4b4:
Tff7b72if Te6edf3announceTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3timestampTb4b4b4:
Te6edf3selected_announce Tff7b72= Te6edf3announce
Tff7b72break
Tff7b72if Te6edf3selected_announce Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_node_announcesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3selected_announceTb4b4b4)
Tff7b72return
Tff7b72for Te6edf3announce Tff7b72in Tff7b72selfTff7b72.Td2a8ff_peer_announcesTb4b4b4:
Tff7b72if Te6edf3announceTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3timestampTb4b4b4:
Te6edf3selected_announce Tff7b72= Te6edf3announce
Tff7b72break
Tff7b72if Te6edf3selected_announce Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_peer_announcesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3selected_announceTb4b4b4)
Tff7b72return
Tff7b72for Te6edf3announce Tff7b72in Tff7b72selfTff7b72.Td2a8ff_pn_announcesTb4b4b4:
Tff7b72if Te6edf3announceTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3timestampTb4b4b4:
Te6edf3selected_announce Tff7b72= Te6edf3announce
Tff7b72break
Tff7b72if Te6edf3selected_announce Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_pn_announcesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3selected_announceTb4b4b4)
Tff7b72return
Tff7b72def Td2a8ffdisplay_nameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72return Te6edf3strip_modifiersTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8ffdisplay_nameTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffsimplest_display_strTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3sanTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffsTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffsanitize_namesTa5d6ff"Tb4b4b4] Tff7b72and Te6edf3sanTb4b4b4: Tff7b72return Te6edf3sanitize_nameTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3strip_modifiersTb4b4b4(Te6edf3nameTb4b4b4)
Te6edf3trust_level Tff7b72= Tff7b72selfTff7b72.Td2a8fftrust_levelTb4b4b4(Te6edf3source_hashTb4b4b4)
Tff7b72if Te6edf3trust_level Tff7b72== Te6edf3DirectoryEntryTff7b72.Td2a8ffWARNING Tff7b72or Te6edf3trust_level Tff7b72== Te6edf3DirectoryEntryTff7b72.Td2a8ffUNTRUSTEDTb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Te6edf3dn Tff7b72= Te6edf3sTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8ffdisplay_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3dnTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3source_hashTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3dnTff7b72+Ta5d6ff"Ta5d6ff <Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3source_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff>Ta5d6ff"
Tff7b72elseTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ff<Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3source_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff>Ta5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Te6edf3dn Tff7b72= Te6edf3sTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8ffdisplay_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3dnTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3source_hashTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3dn
Tff7b72elseTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ff<Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3source_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff>Ta5d6ff"
Tff7b72def Td2a8ffalleged_display_strTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72return Te6edf3strip_modifiersTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8ffdisplay_nameTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8fftrust_levelTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3announced_display_nameTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72if Te6edf3announced_display_name Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8fftrust_level
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8fftrust_level Tff7b72== Te6edf3DirectoryEntryTff7b72.Td2a8ffTRUSTEDTb4b4b4:
Tff7b72for Te6edf3entry Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Te6edf3e Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3entryTb4b4b4]
Tff7b72if Te6edf3eTff7b72.Td2a8ffdisplay_name Tff7b72== Te6edf3announced_display_nameTb4b4b4:
Tff7b72if Te6edf3eTff7b72.Td2a8ffsource_hash Tff7b72!= Te6edf3source_hashTb4b4b4:
Tff7b72return Te6edf3DirectoryEntryTff7b72.Td2a8ffWARNING
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8fftrust_level
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3DirectoryEntryTff7b72.Td2a8ffUNKNOWN
Tff7b72def Td2a8ffpn_trust_levelTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Te6edf3recalled_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3source_hashTb4b4b4)
Tff7b72if Te6edf3recalled_identity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3associated_node Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Ta5d6ff"Ta5d6ffnomadnetwork.nodeTa5d6ff"Tb4b4b4, Te6edf3recalled_identityTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8fftrust_levelTb4b4b4(Te6edf3associated_nodeTb4b4b4)
Tff7b72def Td2a8ffsort_rankTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8ffsort_rank
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffpreferred_deliveryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8ffpreferred_delivery
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3DirectoryEntryTff7b72.Td2a8ffDIRECT
Tff7b72def Td2a8ffrememberTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3entryTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3entryTff7b72.Td2a8ffsource_hashTb4b4b4] Tff7b72= Te6edf3entry
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3entryTff7b72.Td2a8ffsource_hashTb4b4b4)
Tff7b72if Te6edf3identity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3associated_node Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Ta5d6ff"Ta5d6ffnomadnetwork.nodeTa5d6ff"Tb4b4b4, Te6edf3identityTb4b4b4)
Tff7b72if Te6edf3associated_node Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Te6edf3node_entry Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3associated_nodeTb4b4b4]
Te6edf3node_entryTff7b72.Td2a8fftrust_level Tff7b72= Te6edf3entryTff7b72.Td2a8fftrust_level
Tff7b72selfTff7b72.Td2a8ffsave_to_diskTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffforgetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3source_hashTb4b4b4)
Tff7b72def Td2a8fffindTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffis_knownTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsource_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3source_hashTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsource_identityTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffshould_identify_on_connectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Te6edf3entry Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]
Tff7b72return Te6edf3entryTff7b72.Td2a8ffidentify
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffset_identify_on_connectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3stateTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Te6edf3entry Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]
Te6edf3entryTff7b72.Td2a8ffidentify Tff7b72= Te6edf3state
Tff7b72def Td2a8ffknown_nodesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3node_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3eh Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Te6edf3e Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3ehTb4b4b4]
Tff7b72if Te6edf3eTff7b72.Td2a8ffhosts_nodeTb4b4b4:
Te6edf3node_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3eTb4b4b4)
Te6edf3node_listTff7b72.Td2a8ffsortTb4b4b4(Te6edf3key Tff7b72= Tff7b72lambda Te6edf3eTb4b4b4: Tb4b4b4(Te6edf3eTff7b72.Td2a8ffsort_rank Tff7b72if Te6edf3eTff7b72.Td2a8ffsort_rank Tff7b72!= Tff7b72None Tff7b72else T79c0ff2Tff7b72^T79c0ff32Tb4b4b4, Te6edf3DirectoryEntryTff7b72.Td2a8ffTRUSTEDTff7b72-Te6edf3eTff7b72.Td2a8fftrust_levelTb4b4b4, Te6edf3eTff7b72.Td2a8ffdisplay_name Tff7b72if Te6edf3eTff7b72.Td2a8ffdisplay_name Tff7b72!= Tff7b72None Tff7b72else Ta5d6ff"Ta5d6ff_Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3node_list
Tff7b72def Td2a8ffnumber_of_known_nodesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffknown_nodesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffnumber_of_known_peersTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lookback_secondsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3unique_hashes Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3cutoff_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3lookback_seconds
Tff7b72for Te6edf3entry Tff7b72in Tff7b72selfTff7b72.Td2a8ffannounce_streamTb4b4b4:
Tff7b72if Tff7b72not Te6edf3entryTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72in Te6edf3unique_hashesTb4b4b4:
Tff7b72if Te6edf3lookback_seconds Tff7b72== Tff7b72None Tff7b72or Te6edf3entryTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72> Te6edf3cutoff_timeTb4b4b4:
Te6edf3unique_hashesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3entryTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72return Tffa657lenTb4b4b4(Te6edf3unique_hashesTb4b4b4)
Tff7b72class T56d364DirectoryEntryTb4b4b4:
Te6edf3WARNING Tff7b72= T79c0ff0x00
Te6edf3UNTRUSTED Tff7b72= T79c0ff0x01
Te6edf3UNKNOWN Tff7b72= T79c0ff0x02
Te6edf3TRUSTED Tff7b72= T79c0ff0xFF
Te6edf3DIRECT Tff7b72= T79c0ff0x01
Te6edf3PROPAGATED Tff7b72= T79c0ff0x02
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3display_nameTff7b72=Tff7b72NoneTb4b4b4, Te6edf3trust_levelTff7b72=Te6edf3UNKNOWNTb4b4b4, Te6edf3hosts_nodeTff7b72=Tff7b72FalseTb4b4b4, Te6edf3preferred_deliveryTff7b72=Tff7b72NoneTb4b4b4, Te6edf3identify_on_connectTff7b72=Tff7b72FalseTb4b4b4, Te6edf3sort_rankTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3source_hashTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsource_hash Tff7b72= Te6edf3source_hash
Tff7b72selfTff7b72.Td2a8ffdisplay_name Tff7b72= Te6edf3display_name
Tff7b72selfTff7b72.Td2a8ffsort_rank Tff7b72= Te6edf3sort_rank
Tff7b72if Te6edf3preferred_delivery Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpreferred_delivery Tff7b72= Te6edf3DirectoryEntryTff7b72.Td2a8ffDIRECT
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpreferred_delivery Tff7b72= Te6edf3preferred_delivery
Tff7b72selfTff7b72.Td2a8fftrust_level Tff7b72= Te6edf3trust_level
Tff7b72selfTff7b72.Td2a8ffhosts_node Tff7b72= Te6edf3hosts_node
Tff7b72selfTff7b72.Td2a8ffidentify Tff7b72= Te6edf3identify_on_connect
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to add invalid source hash to directoryTa5d6ff"Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────